/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.eam.persitencia.dao.implementacion;

import co.edu.eam.persitencia.dao.Interfaz.IDAOFuncionario;
import co.edu.eam.persitencia.entidades.Especialidad;
import co.edu.eam.persitencia.entidades.Funcionario;
import co.edu.eam.persitencia.entidades.Medico;
import co.edu.eam.persitencia.entidades.Paciente;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

/**
 *
 * @author Erika
 */
public class DAOFuncionario implements IDAOFuncionario {

    private EntityManager em;

    /**
     * metodo para conectar a la base de datos
     *
     * @param em EntityManager de la conexion
     */
    public DAOFuncionario(EntityManager em) {
        this.em = em;
    }

/**
 * metodo que crea un medico en la BD
 * @param medico, objeto medico
 * @throws Exception
 */
    @Override
    public void crearMedico(Medico medico) throws Exception {
        em.getTransaction().begin();
        em.persist(medico);
        em.getTransaction().commit();
    }

/**
 * Metodo que se encarga de buscar un medico por su codigo
 * @param codigo
 * @return
 * @throws Exception
 */
    @Override
    public Medico buscarMedico(String codigo) throws Exception {
        return em.find(Medico.class, codigo);

    }

/**
 * metodo que sirve para editar un medico en la BD
 * @param medico
 * @throws Exception
 */
    @Override
    public void editarMedico(Medico medico) throws Exception {
        em.getTransaction().begin();
        em.merge(medico);
        em.getTransaction().commit();
    }

/**
 * metodo que sirve para eliminar un medico de la BD
 * @param medico
 * @throws Exception
 */
    @Override
    public void eliminarMedico(Medico medico) throws Exception {
        em.getTransaction().begin();
        em.remove(medico);
        em.getTransaction().commit();
    }

/**
 * Metodo que se encarga de listar  todos los medicos
 * @return
 * @throws Exception
 */
    @Override
    public List<Medico> listarTodosLosMedicos() throws Exception {
         Query q=em.createNamedQuery(Medico.CONSULTA_LISTAR_MEDICOS);
       return q.getResultList();
    }

/**
 * Metodo que se encarga de listar  todos los medicos por especialidad
 * @param especialidad
 * @return
 * @throws Exception
 */
    @Override
    public List<Medico> listarPorEspecialidad(Especialidad especialidad) throws Exception {
        Query q = em.createQuery(Medico.CONSULTA_LISTAR_MEDICO_POR_ESPECIALIDAD);
        q.setParameter("especialidad", especialidad);
          List<Medico> lista = q.getResultList();
          
          return lista;
    }

/**
 * metodo que sirve para crear un funcionario en la BD
 * @param funcionario
 * @throws Exception
 */
    @Override
    public void crearFuncionario(Funcionario funcionario) throws Exception {
        em.getTransaction().begin();
        em.persist(funcionario);
        em.getTransaction().commit();
    }

/**
 * metodo que sirve para crear una especialidad en la BD
 * @param especialidad
 * @throws Exception
 */
    @Override
    public void crearEspecialidad(Especialidad especialidad) throws Exception {
        em.getTransaction().begin();
        em.persist(especialidad);
        em.getTransaction().commit();
    }

/**
 * metodo que sirve para editar una especialidad
 * @param especialidad
 * @throws Exception
 */
    @Override
    public void editarEspecialidad(Especialidad especialidad) throws Exception {
        em.getTransaction().begin();
        em.merge(especialidad);
        em.getTransaction().commit();
    }

/**
 * Metodo que se encarga de listar  todos los funcionarios
 * @return
 * @throws Exception
 */
    @Override
    public List<Funcionario> listarTodasLosFuncionarios() throws Exception {
        Query q=em.createNamedQuery(Funcionario.CONSULTA_LISTAR_FUNCIONARIOS);
       return q.getResultList();
    }
    
/**
 * Metodo que se encarga de listar  todas las especialidades
 * @return
 * @throws Exception
 */
    @Override
    public List<Especialidad> listarTodasLasEpecialidades() throws Exception {
        Query q=em.createNamedQuery(Especialidad.CONSULTA_LISTAR_ESPECIALIDAD);
       return q.getResultList();
    }

    @Override
    public void eliminarFuncionario(Funcionario funcionario) throws Exception {
        em.getTransaction().begin();
        em.remove(funcionario);
        em.getTransaction().commit();
    }

    @Override
    public Funcionario buscarFuncionario(String documento) throws Exception {
        return em.find(Funcionario.class, documento);
    }

    @Override
    public void editarFuncionario(Funcionario funcionario) throws Exception {
        em.getTransaction().begin();
        em.merge(funcionario);
        em.getTransaction().commit();
    }

    @Override
    public Especialidad buscarEspecialidad(String codigo) throws Exception {
        return em.find(Especialidad.class, codigo);
    }

    @Override
    public void eliminarEspecialidad(Especialidad especialidad) throws Exception {
        em.getTransaction().begin();
        em.merge(especialidad);
        em.getTransaction().commit();
    
    }
}
